தனிப்பயன் செயல்கள் மூலம் ஜாங்கோவின் நிர்வாக இடைமுகத்தை திறம்படப் பயன்படுத்துங்கள். உலகளாவிய பயன்பாடுகளுக்கான வலிமையான மொத்தச் செயல்பாடுகள், தரவு ஏற்றுமதிகள் மற்றும் ஒருங்கிணைப்புகளை எவ்வாறு செயல்படுத்துவது என்பதைக் கற்றுக்கொள்ளுங்கள்.
உங்கள் ஜாங்கோ நிர்வாகத்தின் சக்தியை வெளிக்கொணர்தல்: தனிப்பயன் நிர்வாகச் செயல்கள் விளக்கப்பட்டது
ஜாங்கோ நிர்வாக இடைமுகம் உண்மையிலேயே ஒரு குறிப்பிடத்தக்க கருவியாகும், இது கட்டமைப்பின் மிகவும் கவர்ச்சிகரமான அம்சங்களில் ஒன்றாக அடிக்கடி குறிப்பிடப்படுகிறது. உடனடியாகப் பயன்படுத்தக்கூடிய வகையில், நிர்வாகப் பணிகளுக்கான எந்தப் பின்தளக் குறியீட்டையும் எழுதாமல், உங்கள் பயன்பாட்டின் தரவை நிர்வகிக்க வலுவான, பயனர் நட்பு மற்றும் பாதுகாப்பான வழியை இது வழங்குகிறது. பல திட்டங்களுக்கு, இது போதுமானதை விட அதிகமாகும். இருப்பினும், பயன்பாடுகள் சிக்கலான தன்மை மற்றும் அளவின் அடிப்படையில் வளரும்போது, எளிய CRUD (உருவாக்குதல், படித்தல், புதுப்பித்தல், நீக்குதல்) பணிகளுக்கு அப்பால் செல்லும் மிகவும் சிறப்பு வாய்ந்த, சக்திவாய்ந்த மற்றும் சூழல் சார்ந்த செயல்பாடுகளின் தேவை எழுகிறது.
இங்குதான் ஜாங்கோவின் தனிப்பயன் நிர்வாகச் செயல்கள் முக்கியத்துவம் பெறுகின்றன. நிர்வாகச் செயல்கள், மாற்றப் பட்டியல் பக்கத்திலிருந்து நேரடியாகத் தேர்ந்தெடுக்கப்பட்ட ஒரு தொகுதி பொருள்கள் மீது குறிப்பிட்ட செயல்பாடுகளைச் செய்ய டெவலப்பர்களை அனுமதிக்கின்றன. நூற்றுக்கணக்கான பயனர் கணக்குகளை "செயலற்றது" எனக் குறிக்க, தேர்ந்தெடுக்கப்பட்ட ஆர்டர்களுக்கான தனிப்பயனாக்கப்பட்ட அறிக்கையை உருவாக்க, அல்லது தயாரிப்புப் புதுப்பிப்புகளின் தொகுதியை ஒரு வெளிப்புற மின் வணிக தளத்துடன் ஒத்திசைக்க – இவை அனைத்தையும் பரிச்சயமான ஜாங்கோ நிர்வாகத்திற்குள் சில கிளிக்குகளில் செய்ய முடிவதைச் சிந்தியுங்கள். தனிப்பயன் நிர்வாகச் செயல்களைப் புரிந்துகொள்ள, செயல்படுத்த மற்றும் திறம்படப் பயன்படுத்த இந்த வழிகாட்டி உங்களை ஒரு விரிவான பயணத்திற்கு அழைத்துச் செல்லும், இதன் மூலம் எந்தவொரு உலகளாவிய பயன்பாட்டிற்கும் உங்கள் நிர்வாகத் திறன்களை கணிசமாக விரிவாக்க உங்களுக்கு அதிகாரம் அளிக்கும்.
ஜாங்கோ நிர்வாகத்தின் மைய வலிமையைப் புரிந்துகொள்ளுதல்
தனிப்பயனாக்கத்தில் மூழ்குவதற்கு முன், ஜாங்கோ நிர்வாகத்தின் அடிப்படைக் கொள்கைகளை அறிந்துகொள்வது அவசியம். இது ஒரு சாதாரண பின்தளம் மட்டுமல்ல; இது ஒரு மாடல் அடிப்படையிலான, ஆற்றல்மிக்க இடைமுகம் ஆகும், இது:
- தானாகவே படிவங்களை உருவாக்குகிறது: உங்கள் மாடல்களின் அடிப்படையில், தரவைச் சேர்க்கவும் திருத்தவும் படிவங்களை உருவாக்குகிறது.
- உறவுகளைக் கையாளுகிறது: உள்ளுணர்வு கொண்ட விட்ஜெட்களுடன் அயல் சாவிகள், பல-பல்கு மற்றும் ஒன்றுக்கு ஒன்று உறவுகளை நிர்வகிக்கிறது.
- அடையாளச் சரிபார்ப்பு மற்றும் அங்கீகாரத்தை வழங்குகிறது: ஜாங்கோவின் வலுவான பயனர் மற்றும் அனுமதி அமைப்புடன் தடையின்றி ஒருங்கிணைக்கிறது.
- வடிகட்டுதல் மற்றும் தேடலை வழங்குகிறது: நிர்வாகிகளை குறிப்பிட்ட தரவு உள்ளீடுகளை விரைவாகக் கண்டறிய அனுமதிக்கிறது.
- சர்வதேசமயமாக்கலை ஆதரிக்கிறது: அதன் இடைமுகத்திற்கான உள்ளமைக்கப்பட்ட மொழிபெயர்ப்பு திறன்களுடன் உலகளாவிய வரிசைப்படுத்தலுக்குத் தயாராக உள்ளது.
இந்த உடனடிச் செயல்பாடு மேம்பாட்டு நேரத்தைக் கணிசமாகக் குறைக்கிறது மற்றும் உங்கள் தரவுக்கான நிலையான, பாதுகாப்பான மேலாண்மை போர்ட்டலை உறுதி செய்கிறது. தனிப்பயன் நிர்வாகச் செயல்கள் இந்த வலுவான அடித்தளத்தின் மீது கட்டப்படுகின்றன, வணிக-தர்க்கம் சார்ந்த செயல்பாடுகளைச் சேர்க்க ஒரு கருவியாகச் செயல்படுகின்றன.
தனிப்பயன் நிர்வாகச் செயல்கள் ஏன் அவசியமானவை
இயல்புநிலை நிர்வாக இடைமுகம் தனிப்பட்ட பொருள்கள் நிர்வாகத்திற்கு சிறந்ததாக இருந்தாலும், பல பொருள்கள் சம்பந்தப்பட்ட அல்லது சிக்கலான வணிகத் தர்க்கம் தேவைப்படும் செயல்பாடுகளுக்கு இது பெரும்பாலும் போதுமானதாக இல்லை. தனிப்பயன் நிர்வாகச் செயல்கள் அவசியமாக மாறும் சில கட்டாய சூழ்நிலைகள் இங்கே:
-
மொத்தத் தரவுச் செயல்பாடுகள்: ஆயிரக்கணக்கான பாடங்களைக் கொண்ட மின்-கற்றல் தளத்தை நிர்வகிப்பதாக கற்பனை செய்து பாருங்கள். உங்களுக்குத் தேவைப்படலாம்:
- பல பாடங்களை "வெளியிடப்பட்டது" அல்லது "வரைவு" எனக் குறிக்க.
- தேர்ந்தெடுக்கப்பட்ட பாடங்களின் குழுவிற்கு ஒரு புதிய பயிற்றுவிப்பாளரை ஒதுக்க.
- காலாவதியான மாணவர் சேர்க்கைகளின் தொகுதியை நீக்க.
-
தரவு ஒத்திசைவு மற்றும் ஒருங்கிணைப்பு: பயன்பாடுகள் பெரும்பாலும் வெளிப்புற அமைப்புகளுடன் தொடர்பு கொள்கின்றன. நிர்வாகச் செயல்கள் இவற்றிற்கு உதவலாம்:
- தேர்ந்தெடுக்கப்பட்ட தயாரிப்பு புதுப்பிப்புகளை ஒரு வெளிப்புற API க்கு (எ.கா., சரக்கு அமைப்பு, கட்டண நுழைவாயில் அல்லது உலகளாவிய மின் வணிக தளம்) அனுப்ப.
- தேடுபொறியில் தேர்ந்தெடுக்கப்பட்ட உள்ளடக்கத்திற்கான தரவு மறு-குறியீட்டைத் தூண்ட.
- வெளிப்புற தளவாட அமைப்பில் ஆர்டர்களை "அனுப்பப்பட்டது" எனக் குறிக்க.
-
தனிப்பயன் அறிக்கை மற்றும் ஏற்றுமதி: ஜாங்கோ நிர்வாகம் அடிப்படை ஏற்றுமதியை வழங்கினாலும், உங்களுக்கு மிகவும் குறிப்பிட்ட அறிக்கைகள் தேவைப்படலாம்:
- ஒரு சந்தைப்படுத்தல் பிரச்சாரத்திற்காக தேர்ந்தெடுக்கப்பட்ட பயனர் மின்னஞ்சல்களின் CSV கோப்பை உருவாக்க.
- ஒரு குறிப்பிட்ட காலத்திற்கான விலைப்பட்டியல்களின் PDF சுருக்கத்தை உருவாக்க.
- ஒரு கணக்கியல் அமைப்புடன் ஒருங்கிணைக்க நிதித் தரவை ஏற்றுமதி செய்ய.
-
பணிப்பாய்வு மேலாண்மை: சிக்கலான பணிப்பாய்வுகளைக் கொண்ட பயன்பாடுகளுக்கு, செயல்கள் செயல்முறைகளை ஒழுங்குபடுத்தலாம்:
- பல நிலுவையிலுள்ள பயனர் பதிவுகளை அங்கீகரிக்க அல்லது நிராகரிக்க.
- தேர்ந்தெடுக்கப்பட்ட ஆதரவு டிக்கெட்டுகளை "தீர்வுற்ற" நிலைக்கு மாற்ற.
- ஒரு குழு பயனர்களுக்கு மின்னஞ்சல் அறிவிப்பைத் தூண்ட.
-
தானியங்கி பணித் தூண்டல்கள்: சில சமயங்களில், ஒரு நிர்வாகச் செயல் நீண்ட செயல்முறையைத் தொடங்கலாம்:
- ஒரு குறிப்பிட்ட தரவுத்தொகுப்பிற்கான தினசரி தரவு காப்புப்பிரதியைத் தொடங்க.
- தேர்ந்தெடுக்கப்பட்ட உள்ளீடுகளில் தரவு இடமாற்ற ஸ்கிரிப்டை இயக்க.
இந்த சூழ்நிலைகள் தனிப்பயன் நிர்வாகச் செயல்கள் எளிய நிர்வாகப் பணிகளுக்கும் சிக்கலான, வணிக ரீதியாக முக்கியமான செயல்பாடுகளுக்கும் இடையிலான இடைவெளியைக் குறைக்கின்றன என்பதை எடுத்துக்காட்டுகின்றன, ஜாங்கோ நிர்வாகத்தை உண்மையிலேயே ஒரு விரிவான மேலாண்மை போர்ட்டலாக மாற்றுகின்றன.
அடிப்படை தனிப்பயன் நிர்வாகச் செயலின் அமைப்பு
அதன் மையத்தில், ஒரு ஜாங்கோ நிர்வாகச் செயல் உங்கள் ModelAdmin
வகுப்பிற்குள் ஒரு பைதான் செயல்பாடு அல்லது முறையாகும். இது மூன்று வாதங்களை எடுத்துக்கொள்கிறது: modeladmin
, request
, மற்றும் queryset
.
modeladmin
: இது தற்போதையModelAdmin
நிகழ்வு. இது நிர்வகிக்கப்படும் மாடல் தொடர்பான பல்வேறு பயன்பாட்டு முறைகள் மற்றும் பண்புக்கூறுகளுக்கான அணுகலை வழங்குகிறது.request
: தற்போதைய HTTP கோரிக்கை பொருள். இது ஒரு நிலையான ஜாங்கோHttpRequest
பொருள், இது பயனர் தகவல், POST/GET தரவு, அமர்வு தரவு போன்றவற்றுக்கான அணுகலை உங்களுக்கு வழங்குகிறது.queryset
: தற்போது தேர்ந்தெடுக்கப்பட்ட பொருள்களின் ஒருQuerySet
. இது முக்கியமான பகுதியாகும், ஏனெனில் இது செயல்பாடு செய்யப்பட வேண்டிய அனைத்து மாடல் நிகழ்வுகளையும் கொண்டுள்ளது.
செயல்பாட்டுச் செயல்பாடு, ஒரு மென்மையான பயனர் அனுபவத்தை உறுதிப்படுத்த, அசல் மாற்றப் பட்டியல் பக்கத்திற்கு ஒரு HttpResponseRedirect
ஐத் திருப்பி அனுப்ப வேண்டும். இது எதையும் திருப்பி அனுப்பவில்லை என்றால் (அல்லது None
ஐத் திருப்பி அனுப்பினால்), நிர்வாகி தற்போதைய பக்கத்தை மீண்டும் ஏற்றும். ஜாங்கோவின் செய்திகள் கட்டமைப்பைப் பயன்படுத்தி பயனர் கருத்துக்களை வழங்குவதும் ஒரு நல்ல நடைமுறையாகும்.
படிநிலை வழிமுறை: உங்கள் முதல் தனிப்பயன் நிர்வாகச் செயலை செயல்படுத்துதல்
ஒரு நடைமுறை உதாரணத்தை உருவாக்குவோம். எங்களிடம் ஒரு Product
மாடல் உள்ளது என்று கற்பனை செய்து பாருங்கள், தேர்ந்தெடுக்கப்பட்ட தயாரிப்புகளை "தள்ளுபடி செய்யப்பட்டது" எனக் குறிக்க ஒரு செயல்பாடு வேண்டும்.
# myapp/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2)
is_discounted = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
இப்போது, myapp/admin.py
இல் தனிப்பயன் நிர்வாகச் செயலைச் சேர்ப்போம்:
# myapp/admin.py
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.http import HttpRequest
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'price', 'is_discounted', 'created_at')
list_filter = ('is_discounted', 'created_at')
search_fields = ('name',)
# Define the custom admin action function
def make_discounted(self, request: HttpRequest, queryset: QuerySet):
updated_count = queryset.update(is_discounted=True)
self.message_user(
request,
f"{updated_count} product(s) were successfully marked as discounted.",
messages.SUCCESS
)
make_discounted.short_description = "Mark selected products as discounted"
# Register the action with the ModelAdmin
actions = [make_discounted]
விளக்கம்:
- செயல்பாட்டுச் செயல்பாடு:
make_discounted
என்பதைProductAdmin
இன் ஒரு முறையாக வரையறுத்துள்ளோம். ஒரு தனிModelAdmin
க்கு குறிப்பிட்ட செயல்களுக்கு இது பரிந்துரைக்கப்பட்ட அணுகுமுறையாகும். - கையெழுத்து: இது
self
(இது ஒரு முறை என்பதால்),request
, மற்றும்queryset
ஆகியவற்றைச் சரியாக ஏற்றுக்கொள்கிறது. - தர்க்கம்: செயல்பாட்டிற்குள், தேர்ந்தெடுக்கப்பட்ட அனைத்து பொருள்களையும் ஒரே தரவுத்தள வினவலில் திறமையாகப் புதுப்பிக்க
queryset.update(is_discounted=True)
ஐப் பயன்படுத்துகிறோம். இது வினவல் தொகுதியைக் கடந்து ஒவ்வொரு பொருளையும் தனித்தனியாகச் சேமிப்பதை விட மிகவும் திறமையானது. - பயனர் கருத்து:
self.message_user()
என்பது நிர்வாக இடைமுகத்தில் பயனருக்கு செய்திகளைக் காண்பிக்கModelAdmin
வழங்கிய ஒரு வசதியான முறையாகும். நேர்மறையான குறிப்பிற்காகmessages.SUCCESS
ஐப் பயன்படுத்துகிறோம். short_description
: இந்த பண்புக்கூறு, நிர்வாகத்தில் உள்ள "செயல்" கீழிறங்கு பட்டியலில் தோன்றும் பயனர் நட்பு பெயரை வரையறுக்கிறது. இது இல்லாமல், செயல்பாட்டின் அசல் பெயர் (எ.கா., "make_discounted") காட்டப்படும், இது பயனருக்கு உகந்ததல்ல.actions
பட்டியல்: இறுதியாக, எங்கள்ProductAdmin
வகுப்பில் உள்ளactions
பட்டியலில் அதன் செயல்பாட்டு மேற்கோளைச் சேர்ப்பதன் மூலம் எங்கள் செயலைப் பதிவு செய்கிறோம்.
இப்போது, ஜாங்கோ நிர்வாகத்தில் உள்ள தயாரிப்பு மாற்றப் பட்டியல் பக்கத்திற்குச் சென்று, சில தயாரிப்புகளைத் தேர்ந்தெடுத்து, கீழிறங்கு பட்டியலில் இருந்து "தேர்ந்தெடுக்கப்பட்ட தயாரிப்புகளைத் தள்ளுபடி செய்யப்பட்டது எனக் குறிக்கவும்" என்பதைத் தேர்ந்தெடுத்தால், தேர்ந்தெடுக்கப்பட்ட உருப்படிகள் புதுப்பிக்கப்படும், மேலும் உங்களுக்கு ஒரு வெற்றிச் செய்தி தோன்றும்.
பயனர் உறுதிப்படுத்தலுடன் செயல்களை மேம்படுத்துதல்: தற்செயலான செயல்பாடுகளைத் தடுத்தல்
"தேர்ந்தெடுக்கப்பட்ட அனைத்தையும் நீக்கு" அல்லது "அனைத்து உள்ளடக்கத்தையும் வெளியிடு" போன்ற ஒரு செயலை உறுதிப்படுத்தல் இல்லாமல் நேரடியாக செயல்படுத்துவது குறிப்பிடத்தக்க தரவு இழப்பு அல்லது எதிர்பாராத விளைவுகளுக்கு வழிவகுக்கும். முக்கியமான செயல்பாடுகளுக்கு, ஒரு இடைநிலை உறுதிப்படுத்தல் படிநிலையைச் சேர்ப்பது மிகவும் முக்கியம். இதில் பொதுவாக ஒரு உறுதிப்படுத்தல் படிவத்துடன் ஒரு தனிப்பயன் டெம்ப்ளேட்டை வழங்குவது அடங்கும்.
உறுதிப்படுத்தல் படிநிலையைச் சேர்க்க எங்கள் make_discounted
செயலைச் செம்மைப்படுத்துவோம். விளக்க நோக்கங்களுக்காக இதை இன்னும் பொதுவானதாக மாற்றுவோம், ஒருவேளை "உறுதிப்படுத்தலுடன் உருப்படிகளை 'அங்கீகரிக்கப்பட்டது' எனக் குறிக்கவும்" என்பதாக இருக்கலாம்.
# myapp/models.py (assuming a Post model)
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
status = models.CharField(max_length=20, default='draft', choices=[
('draft', 'Draft'),
('pending', 'Pending Review'),
('approved', 'Approved'),
('rejected', 'Rejected'),
])
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
முதலில், உறுதிப்படுத்தலுக்கு ஒரு எளிய படிவம் தேவை:
# myapp/forms.py
from django import forms
class ConfirmationForm(forms.Form):
confirm = forms.BooleanField(
label="Are you sure you want to perform this action?",
required=True,
widget=forms.HiddenInput # We'll handle the display in the template
)
_selected_action = forms.CharField(widget=forms.HiddenInput)
action = forms.CharField(widget=forms.HiddenInput)
அடுத்து, myapp/admin.py
இல் உள்ள செயல்பாடு:
# myapp/admin.py
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from .models import Post
from .forms import ConfirmationForm
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'status', 'created_at')
list_filter = ('status',)
search_fields = ('title',)
def mark_posts_approved(self, request: HttpRequest, queryset: QuerySet) -> HttpResponseRedirect | None:
# Check if the user confirmed the action
if 'apply' in request.POST:
form = ConfirmationForm(request.POST)
if form.is_valid():
updated_count = queryset.update(status='approved')
self.message_user(
request,
f"{updated_count} post(s) were successfully marked as approved.",
messages.SUCCESS
)
return HttpResponseRedirect(request.get_full_path())
# If not confirmed, or GET request, show confirmation page
else:
# Store the selected objects' primary keys in a hidden field
# This is crucial for passing the selection across the confirmation page
context = self.admin_site.each_context(request)
context['queryset'] = queryset
context['form'] = ConfirmationForm(initial={
'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME),
'action': 'mark_posts_approved',
})
context['action_name'] = self.mark_posts_approved.short_description
context['title'] = _("Confirm Action")
# Render a custom confirmation template
return render(request, 'admin/confirmation_action.html', context)
mark_posts_approved.short_description = _("Mark selected posts as approved")
actions = [mark_posts_approved]
மற்றும் அதனுடன் தொடர்புடைய டெம்ப்ளேட் (templates/admin/confirmation_action.html
):
{# templates/admin/confirmation_action.html #}
{% extends "admin/base_site.html" %}
{% load i18n admin_urls static admin_modify %}
{% block extrastyle %}{{ block.super }}
{% endblock %}
{% block content %}
{% endblock %}
டெம்ப்ளேட்டைக் கண்டறியக்கூடியதாக மாற்ற, உங்கள் பயன்பாட்டில் (myapp/templates/admin/
) அல்லது உங்கள் settings.py
's TEMPLATES
அமைப்பில் ஒரு templates
அடைவு உள்ளதா என்பதை உறுதிப்படுத்தவும்.
உறுதிப்படுத்தல் செயல்களுக்கான முக்கிய கூறுகள்:
- நிபந்தனை தர்க்கம்: செயல்பாடு
if 'apply' in request.POST:
என்பதை சரிபார்க்கிறது. பயனர் உறுதிப்படுத்தல் படிவத்தைச் சமர்ப்பித்திருந்தால், செயல்பாடு தொடரும். இல்லையெனில், அது உறுதிப்படுத்தல் பக்கத்தை வழங்குகிறது. _selected_action
: இந்த மறைக்கப்பட்ட புலம் முக்கியமானது. ஜாங்கோ நிர்வாகம், தேர்ந்தெடுக்கப்பட்ட பொருட்களின் முதன்மை சாவிகளைaction_checkbox
என்ற பெயரில் ஒரு POST அளவுரு வழியாக அனுப்புகிறது. உறுதிப்படுத்தல் படிவத்தை வழங்கும் போது,request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
ஐப் பயன்படுத்தி இந்த ஐடிகளைப் பிரித்தெடுத்து, எங்கள் உறுதிப்படுத்தல் படிவத்தில் மறைக்கப்பட்ட உள்ளீடுகளாக மீண்டும் அனுப்புகிறோம். பயனர் உறுதிப்படுத்தும் போது, அசல் தேர்வு மீண்டும் செயலுக்கு அனுப்பப்படுவதை இது உறுதி செய்கிறது.- தனிப்பயன் படிவம்: பயனரின் உறுதிப்படுத்தலை எடுக்க ஒரு எளிய
forms.Form
பயன்படுத்தப்படுகிறது.confirm
க்கான மறைக்கப்பட்ட உள்ளீட்டைப் பயன்படுத்தும் போது, டெம்ப்ளேட் கேள்வியை நேரடியாகக் காட்டுகிறது. - டெம்ப்ளேட்டை வழங்குதல்: எங்கள் தனிப்பயன்
confirmation_action.html
ஐக் காண்பிக்கdjango.shortcuts.render()
ஐப் பயன்படுத்துகிறோம். காண்பிக்கqueryset
மற்றும்form
ஐ டெம்ப்ளேட்டிற்கு அனுப்புகிறோம். - CSRF பாதுகாப்பு: Cross-Site Request Forgery தாக்குதல்களைத் தடுக்க, படிவங்களில் (உங்கள் செயல் டெம்ப்ளேட்டுகளில் உள்ள தனிப்பயன் படிவங்கள் உட்பட) எப்போதும்
{% csrf_token %}
ஐச் சேர்க்கவும். - திரும்பும் மதிப்பு: வெற்றிகரமான செயல்படுத்தலுக்குப் பிறகு, பயனரை நிர்வாக மாற்றப் பட்டியல் பக்கத்திற்குத் திருப்பி அனுப்ப
HttpResponseRedirect(request.get_full_path())
ஐத் திருப்பி அனுப்புகிறோம், இது அவர்கள் புதுப்பித்தால் இரட்டை படிவச் சமர்ப்பிப்பைத் தடுக்கிறது.
இந்த மாதிரி, முக்கியமான நிர்வாகச் செயல்களுக்கான உறுதிப்படுத்தல் உரையாடல்களைச் செயல்படுத்த ஒரு வலுவான வழியை வழங்குகிறது, பயனர் அனுபவத்தை மேம்படுத்துகிறது மற்றும் விலையுயர்ந்த தவறுகளைத் தடுக்கிறது.
செயல்களுக்குப் பயனர் உள்ளீட்டைச் சேர்த்தல்: மாறும் செயல்பாடுகள்
சில சமயங்களில், ஒரு எளிய "ஆம்/இல்லை" உறுதிப்படுத்தல் போதுமானதாக இருக்காது. நிர்வாகி ஒரு செயலுக்கான காரணம், ஒரு புலத்திற்கான புதிய மதிப்பு அல்லது முன்வரையறுக்கப்பட்ட பட்டியலில் இருந்து ஒரு தேர்வு போன்ற கூடுதல் உள்ளீட்டை வழங்க வேண்டியிருக்கலாம். இதற்கு உங்கள் நிர்வாகச் செயல்களில் மிகவும் சிக்கலான படிவங்களை இணைக்க வேண்டும்.
ஒரு உதாரணத்தைக் கருத்தில் கொள்வோம்: தேர்ந்தெடுக்கப்பட்ட Post
பொருள்களுக்கு "நிலையை மாற்றி ஒரு கருத்தைச் சேர்க்கவும்" என்ற செயல்.
# myapp/forms.py
from django import forms
from .models import Post
class ChangePostStatusForm(forms.Form):
_selected_action = forms.CharField(widget=forms.HiddenInput)
action = forms.CharField(widget=forms.HiddenInput)
new_status = forms.ChoiceField(
label="New Status",
choices=Post.STATUS_CHOICES, # Assuming STATUS_CHOICES defined in Post model
required=True
)
comment = forms.CharField(
label="Reason/Comment (optional)",
required=False,
widget=forms.Textarea(attrs={'rows': 3})
)
# Add STATUS_CHOICES to Post model
# myapp/models.py
from django.db import models
class Post(models.Model):
STATUS_CHOICES = [
('draft', 'Draft'),
('pending', 'Pending Review'),
('approved', 'Approved'),
('rejected', 'Rejected'),
]
title = models.CharField(max_length=255)
content = models.TextField()
status = models.CharField(max_length=20, default='draft', choices=STATUS_CHOICES)
comment_history = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
இப்போது, myapp/admin.py
இல் உள்ள செயல்பாடு:
# myapp/admin.py (continued)
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from .models import Post
from .forms import ChangePostStatusForm # Import the new form
# ... (ProductAdmin and PostAdmin definitions, other imports)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'status', 'created_at')
list_filter = ('status',)
search_fields = ('title',)
# Existing mark_posts_approved action...
def change_post_status_with_comment(self, request: HttpRequest, queryset: QuerySet) -> HttpResponseRedirect | None:
form = None
if 'apply' in request.POST:
form = ChangePostStatusForm(request.POST)
if form.is_valid():
new_status = form.cleaned_data['new_status']
comment = form.cleaned_data['comment']
updated_count = 0
for post in queryset:
post.status = new_status
if comment:
post.comment_history = (post.comment_history or '') + f"\n[{request.user.username}] changed to {new_status} with comment: {comment}"
post.save()
updated_count += 1
self.message_user(
request,
f"{updated_count} post(s) had their status changed to '{new_status}' and comment added.",
messages.SUCCESS
)
return HttpResponseRedirect(request.get_full_path())
# If not confirmed, or GET request, show the input form
if not form:
form = ChangePostStatusForm(initial={
'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME),
'action': 'change_post_status_with_comment',
})
context = self.admin_site.each_context(request)
context['queryset'] = queryset
context['form'] = form
context['action_name'] = self.change_post_status_with_comment.short_description
context['title'] = _("Change Post Status and Add Comment")
return render(request, 'admin/change_status_action.html', context)
change_post_status_with_comment.short_description = _("Change status for selected posts (with comment)")
actions = [
mark_posts_approved,
change_post_status_with_comment
]
மற்றும் அதனுடன் தொடர்புடைய டெம்ப்ளேட் (templates/admin/change_status_action.html
):
{# templates/admin/change_status_action.html #}
{% extends "admin/base_site.html" %}
{% load i18n admin_urls static admin_modify %}
{% block extrastyle %}{{ block.super }}
{% endblock %}
{% block content %}
{% endblock %}
பயனர் உள்ளீட்டுச் செயல்களுக்கான முக்கிய அம்சங்கள்:
- அர்ப்பணிக்கப்பட்ட படிவம்: தேவையான அனைத்து பயனர் உள்ளீடுகளையும் பெற, ஒரு அர்ப்பணிக்கப்பட்ட
forms.Form
(அல்லது ஒரு ஒற்றை மாடல் நிகழ்வுடன் தொடர்பு கொண்டால்forms.ModelForm
) ஐ உருவாக்கவும். - படிவ சரிபார்ப்பு: ஜாங்கோவின் படிவ சரிபார்ப்பு தரவு ஒருமைப்பாடு மற்றும் பிழை செய்திகளைக் கைமுறையாகக் கையாளுகிறது.
form.is_valid():
ஐ அணுகுவதற்கு முன்if form.is_valid():
என்பதைச் சரிபார்க்கவும். - மீண்டும் மீண்டும் செய்தல் Vs. மொத்த புதுப்பிப்பு:
comment_history
க்கு ஒரு கருத்தைச் சேர்க்கும் போது, நாம் வினவல் தொகுதியைக் கடந்து ஒவ்வொரு பொருளையும் தனித்தனியாகச் சேமிக்கிறோம் என்பதைக் கவனியுங்கள். ஏனெனில்.update()
, ஒவ்வொரு பொருளுக்கும் ஏற்கனவே உள்ள புலத்திற்கு உரையை இணைப்பது போன்ற சிக்கலான தர்க்கத்தைப் பயன்படுத்த முடியாது. மிக பெரிய வினவல் தொகுதிகளுக்கு இது குறைந்த செயல்திறன் கொண்டதாக இருந்தாலும், ஒரு பொருளின் அடிப்படையிலான தர்க்கம் தேவைப்படும் செயல்பாடுகளுக்கு இது அவசியம். எளிய புலம் புதுப்பிப்புகளுக்கு,queryset.update()
விரும்பப்படுகிறது. - பிழைகளுடன் படிவத்தை மீண்டும் வழங்குதல்:
form.is_valid()
ஆனதுFalse
ஐத் திருப்பி அளித்தால்,render()
செயல்பாடு படிவத்தை மீண்டும் காண்பிக்கும், தானாகவே சரிபார்ப்பு பிழைகளைச் சேர்த்து, இது ஒரு நிலையான ஜாங்கோ படிவக் கையாளுதல் முறை ஆகும்.
இந்த அணுகுமுறை மிகவும் நெகிழ்வான மற்றும் மாறும் நிர்வாகச் செயல்பாடுகளை அனுமதிக்கிறது, இதில் நிர்வாகி ஒரு செயலுக்கான குறிப்பிட்ட அளவுருக்களை வழங்க முடியும்.
மேம்பட்ட தனிப்பயன் நிர்வாகச் செயல்கள்: அடிப்படைக்கும் அப்பால்
வெளிப்புற சேவைகளுடன் ஒருங்கிணைக்கும்போது, சிக்கலான அறிக்கைகளை உருவாக்கும்போது அல்லது நீண்ட நேரம் எடுக்கும் பணிகளைச் செய்யும்போது தனிப்பயன் நிர்வாகச் செயல்களின் உண்மையான சக்தி வெளிப்படுகிறது. சில மேம்பட்ட பயன்பாட்டு நிகழ்வுகளை ஆராய்வோம்.
1. தரவு ஒத்திசைவுக்கான வெளிப்புற API களை அழைத்தல்
உங்கள் ஜாங்கோ பயன்பாடு ஒரு தயாரிப்பு அட்டவணையை நிர்வகிக்கிறது என்று கற்பனை செய்து பாருங்கள், மேலும் தேர்ந்தெடுக்கப்பட்ட தயாரிப்புகளை ஒரு வெளிப்புற மின் வணிக தளத்துடன் அல்லது ஒரு உலகளாவிய சரக்கு மேலாண்மை அமைப்புடன் (IMS) அதன் API வழியாக ஒத்திசைக்க வேண்டும். ஒரு நிர்வாகச் செயல் இந்த ஒத்திசைவைத் தூண்டலாம்.
முன்பு வரையறுக்கப்பட்ட ஒரு Product
மாடல் எங்களிடம் உள்ளது என்று வைத்துக்கொள்வோம், மேலும் தேர்ந்தெடுக்கப்பட்ட தயாரிப்புகளுக்கான புதுப்பிப்புகளை ஒரு வெளிப்புற சரக்கு சேவைக்கு அனுப்ப விரும்புகிறோம்.
# myapp/admin.py (continued)
import requests # You'll need to install requests: pip install requests
# ... other imports ...
# Assuming ProductAdmin from earlier
class ProductAdmin(admin.ModelAdmin):
# ... existing list_display, list_filter, search_fields ...
def sync_products_to_external_ims(self, request: HttpRequest, queryset: QuerySet) -> HttpResponseRedirect | None:
# Check for confirmation (similar to previous examples if needed)
if 'apply' in request.POST:
# Simulate an external API endpoint
EXTERNAL_IMS_API_URL = "https://api.example.com/v1/products/sync/"
API_KEY = "your_secret_api_key" # In a real app, use settings.py or environment variables
successful_syncs = 0
failed_syncs = []
for product in queryset:
data = {
"product_id": product.id,
"name": product.name,
"price": str(product.price), # Convert Decimal to string for JSON
"is_discounted": product.is_discounted,
# Add other relevant product data
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
try:
response = requests.post(EXTERNAL_IMS_API_URL, json=data, headers=headers, timeout=5) # 5-second timeout
response.raise_for_status() # Raise an HTTPError for bad responses (4xx or 5xx)
successful_syncs += 1
except requests.exceptions.RequestException as e:
failed_syncs.append(f"Product {product.name} (ID: {product.id}): {e}")
except Exception as e:
failed_syncs.append(f"Product {product.name} (ID: {product.id}): Unexpected error: {e}")
if successful_syncs > 0:
self.message_user(
request,
f"{successful_syncs} product(s) successfully synchronized with external IMS.",
messages.SUCCESS
)
if failed_syncs:
error_message = f"Failed to synchronize {len(failed_syncs)} product(s):\n" + "\n".join(failed_syncs)
self.message_user(request, error_message, messages.ERROR)
return HttpResponseRedirect(request.get_full_path())
# Initial GET request or non-apply POST request: show confirmation (if desired)
context = self.admin_site.each_context(request)
context['queryset'] = queryset
context['form'] = ConfirmationForm(initial={
'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME),
'action': 'sync_products_to_external_ims',
})
context['action_name'] = self.sync_products_to_external_ims.short_description
context['title'] = _("Confirm Data Synchronization")
return render(request, 'admin/confirmation_action.html', context) # Re-use confirmation template
sync_products_to_external_ims.short_description = _("Synchronize selected products with external IMS")
actions = [
# ... other actions ...
sync_products_to_external_ims,
]
API ஒருங்கிணைப்புகளுக்கான முக்கியமான பரிசீலனைகள்:
- பிழை கையாளுதல்: பிணைய கோரிக்கைகளுக்கு வலிமையான
try-except
தொகுதிகள் முக்கியம். இணைப்புப் பிழைகள், காலாவதிகள் மற்றும் API குறிப்பிட்ட பிழைகளைக் கையாளவும் (எ.கா., 401 அங்கீகரிக்கப்படாதது, 404 கண்டறியப்படவில்லை, 500 உள் சேவையகப் பிழை). - பாதுகாப்பு: API சாவிகள் மற்றும் முக்கியமான நற்சான்றுகள் ஒருபோதும் குறியீட்டில் கடினமாக்கப்படக்கூடாது. ஜாங்கோ அமைப்புகள் (எ.கா.,
settings.EXTERNAL_API_KEY
) அல்லது சூழல் மாறிகளைப் பயன்படுத்தவும். - செயல்திறன்: பல உருப்படிகளை ஒத்திசைக்கும்போது, API கோரிக்கைகளை தொகுக்க அல்லது, இன்னும் சிறப்பாக, ஒத்திசைவற்ற பணிகளைப் பயன்படுத்த (கீழே பார்க்கவும்) கருத்தில் கொள்ளவும்.
- பயனர் கருத்து: எந்த உருப்படிகள் வெற்றி பெற்றன, எவை தோல்வியடைந்தன என்பது பற்றிய தெளிவான செய்திகளைப் பிழை விவரங்களுடன் வழங்கவும்.
2. அறிக்கைகள் மற்றும் தரவு ஏற்றுமதிகளை உருவாக்குதல் (CSV/Excel)
தேர்ந்தெடுக்கப்பட்ட தரவை ஏற்றுமதி செய்வது ஒரு பொதுவான தேவையாகும். ஜாங்கோ நிர்வாகச் செயல்கள், தேர்ந்தெடுக்கப்பட்ட வினவல் தொகுதியிலிருந்து நேரடியாக தனிப்பயன் CSV அல்லது Excel கோப்புகளை உருவாக்கப் பயன்படுத்தப்படலாம்.
தேர்ந்தெடுக்கப்பட்ட Post
தரவை ஒரு CSV கோப்பிற்கு ஏற்றுமதி செய்ய ஒரு செயலை உருவாக்குவோம்.
# myapp/admin.py (continued)
import csv
from django.http import HttpResponse
# ... other imports ...
class PostAdmin(admin.ModelAdmin):
# ... existing list_display, list_filter, search_fields, actions ...
def export_posts_as_csv(self, request: HttpRequest, queryset: QuerySet) -> HttpResponse:
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="posts_export.csv"'
writer = csv.writer(response)
# Write header row
writer.writerow(['Title', 'Status', 'Created At', 'Content Preview'])
for post in queryset:
writer.writerow([
post.title,
post.get_status_display(), # Use get_FOO_display() for choice fields
post.created_at.strftime("%Y-%m-%d %H:%M:%S"),
post.content[:100] + '...' if len(post.content) > 100 else post.content # Truncate long content
])
self.message_user(
request,
f"{queryset.count()} post(s) successfully exported to CSV.",
messages.SUCCESS
)
return response
export_posts_as_csv.short_description = _("Export selected posts as CSV")
actions = [
# ... other actions ...
export_posts_as_csv,
]
Excel ஏற்றுமதிகளுக்கு: நீங்கள் பொதுவாக openpyxl
அல்லது pandas
போன்ற ஒரு நூலகத்தைப் பயன்படுத்துவீர்கள். கொள்கை ஒத்ததாகும்: நினைவகத்தில் கோப்பை உருவாக்கி, சரியான Content-Type
(எ.கா., .xlsx க்கு application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
) உடன் ஒரு HttpResponse
இல் அதை இணைக்கவும்.
3. நீண்ட நேரம் எடுக்கும் பணிகளுக்கான ஒத்திசைவற்ற செயல்கள்
ஒரு நிர்வாகச் செயல் கணிசமான நேரம் எடுக்கும் செயல்பாடுகளை (எ.கா., பெரிய தரவுத்தொகுப்புகளை செயலாக்குதல், சிக்கலான அறிக்கைகளை உருவாக்குதல், மெதுவாக இயங்கும் வெளிப்புற API களுடன் தொடர்பு கொள்ளுதல்) உள்ளடக்கியிருந்தால், அவற்றை ஒத்திசைவாகச் செயல்படுத்துவது வலை சேவையகத்தைத் தடுத்து, காலாவதிகள் அல்லது மோசமான பயனர் அனுபவத்திற்கு வழிவகுக்கும். இந்த பணிகளை Celery போன்ற ஒரு பணி வரிசை அமைப்பைப் பயன்படுத்தி ஒரு பின்னணி பணியாளருக்கு அனுப்ப வேண்டும் என்பதே தீர்வாகும்.
முன்நிபந்தனைகள்:
- Celery: Celery மற்றும் ஒரு புரோக்கரை (எ.கா., Redis அல்லது RabbitMQ) நிறுவவும்.
- Django-Celery-Results: விருப்பமானது, ஆனால் தரவுத்தளத்தில் பணி முடிவுகளைச் சேமிக்கப் பயனுள்ளது.
எங்கள் API ஒத்திசைவு உதாரணத்தை ஒத்திசைவற்றதாக மாற்றியமைப்போம்.
# myproject/celery.py (standard Celery setup)
import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
# myapp/tasks.py
import requests
from celery import shared_task
from django.contrib.auth import get_user_model
from django.apps import apps
@shared_task
def sync_product_to_external_ims_task(product_id, admin_user_id):
Product = apps.get_model('myapp', 'Product')
User = get_user_model()
try:
product = Product.objects.get(pk=product_id)
admin_user = User.objects.get(pk=admin_user_id)
EXTERNAL_IMS_API_URL = "https://api.example.com/v1/products/sync/"
API_KEY = "your_secret_api_key" # Use environment variables or Django settings
data = {
"product_id": product.id,
"name": product.name,
"price": str(product.price),
"is_discounted": product.is_discounted,
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(EXTERNAL_IMS_API_URL, json=data, headers=headers, timeout=10)
response.raise_for_status()
# Log success (e.g., to Django logs or a specific model for tracking)
print(f"Product {product.name} (ID: {product.id}) synchronized by {admin_user.username} successfully.")
except Product.DoesNotExist:
print(f"Product with ID {product_id} not found.")
except User.DoesNotExist:
print(f"Admin user with ID {admin_user_id} not found.")
except requests.exceptions.RequestException as e:
print(f"API sync failed for product {product_id}: {e}")
except Exception as e:
print(f"Unexpected error during sync for product {product_id}: {e}")
# myapp/admin.py (continued)
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from .models import Product # Assuming Product model from earlier
from .tasks import sync_product_to_external_ims_task # Import your Celery task
class ProductAdmin(admin.ModelAdmin):
# ... existing list_display, list_filter, search_fields ...
def async_sync_products_to_external_ims(self, request: HttpRequest, queryset: QuerySet) -> HttpResponseRedirect | None:
if 'apply' in request.POST:
admin_user_id = request.user.id
for product in queryset:
# Enqueue the task for each selected product
sync_product_to_external_ims_task.delay(product.id, admin_user_id)
self.message_user(
request,
f"{queryset.count()} product(s) synchronization tasks have been queued.",
messages.SUCCESS
)
return HttpResponseRedirect(request.get_full_path())
# Initial GET request or non-apply POST request: show confirmation
context = self.admin_site.each_context(request)
context['queryset'] = queryset
context['form'] = ConfirmationForm(initial={
'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME),
'action': 'async_sync_products_to_external_ims',
})
context['action_name'] = self.async_sync_products_to_external_ims.short_description
context['title'] = _("Confirm Asynchronous Data Synchronization")
return render(request, 'admin/confirmation_action.html', context) # Re-use confirmation template
async_sync_products_to_external_ims.short_description = _("Queue async sync for selected products to IMS")
actions = [
# ... other actions ...
async_sync_products_to_external_ims,
]
இது எவ்வாறு செயல்படுகிறது:
- நிர்வாகச் செயல்பாடு, நேரடியாகச் சுமையைச் செய்யாமல், தேர்ந்தெடுக்கப்பட்ட வினவல் தொகுதியைக் கடந்து செல்கிறது.
- தேர்ந்தெடுக்கப்பட்ட ஒவ்வொரு பொருளுக்கும், அது Celery பணிக்கு
.delay()
ஐ அழைக்கிறது, தொடர்புடைய அளவுருக்களை (எ.கா., முதன்மை சாவி, பயனர் ஐடி) அனுப்புகிறது. இது பணியை வரிசையில் வைக்கிறது. - நிர்வாகச் செயல்பாடு உடனடியாக ஒரு
HttpResponseRedirect
மற்றும் ஒரு வெற்றிச் செய்தியைத் திருப்பி அனுப்புகிறது, பணிகள் வரிசையில் வைக்கப்பட்டுள்ளன என்று பயனருக்குத் தெரிவிக்கிறது. வலை கோரிக்கை குறுகிய காலமானது. - பின்னணியில், Celery பணியாளர்கள் புரோக்கரிலிருந்து இந்த பணிகளை எடுத்து அவற்றை வலை கோரிக்கையிலிருந்து சுயாதீனமாக செயல்படுத்துகிறார்கள்.
மேலும் சிக்கலான சூழ்நிலைகளுக்கு, நிர்வாகத்திற்குள் பணி முன்னேற்றம் மற்றும் முடிவுகளைக் கண்காணிக்க விரும்பலாம். django-celery-results
போன்ற நூலகங்கள் பணி நிலைகளை தரவுத்தளத்தில் சேமிக்க முடியும், இது ஒரு நிலை பக்கத்திற்கான இணைப்பைக் காட்ட அல்லது நிர்வாக UI ஐ மாறும் வகையில் புதுப்பிக்க உங்களை அனுமதிக்கிறது.
தனிப்பயன் நிர்வாகச் செயல்களுக்கான சிறந்த நடைமுறைகள்
உங்கள் தனிப்பயன் நிர்வாகச் செயல்கள் வலுவான, பாதுகாப்பான மற்றும் பராமரிக்கக்கூடியதாக இருப்பதை உறுதிப்படுத்த, இந்த சிறந்த நடைமுறைகளைப் பின்பற்றுங்கள்:
1. அனுமதிகள் மற்றும் அங்கீகாரம்
அனைத்து நிர்வாகிகளுக்கும் அனைத்து செயல்களுக்கும் அணுகல் இருக்கக்கூடாது. ஜாங்கோவின் அனுமதி அமைப்பைப் பயன்படுத்தி ஒரு செயலை யார் பார்க்கிறார்கள் மற்றும் செயல்படுத்தலாம் என்பதைக் கட்டுப்படுத்தலாம்.
முறை 1: has_perm()
ஐப் பயன்படுத்துதல்
உங்கள் செயல்பாடு செயல்பாட்டிற்குள் குறிப்பிட்ட அனுமதிகளைச் சரிபார்க்கலாம்:
def sensitive_action(self, request, queryset):
if not request.user.has_perm('myapp.can_perform_sensitive_action'):
self.message_user(request, _("You do not have permission to perform this action."), messages.ERROR)
return HttpResponseRedirect(request.get_full_path())
# ... sensitive action logic ...
பின்னர், உங்கள் myapp/models.py
இல் உள்ள Meta
வகுப்பிற்குள் தனிப்பயன் அனுமதியை வரையறுக்கவும்:
# myapp/models.py
class Product(models.Model):
# ... fields ...
class Meta:
permissions = [
("can_perform_sensitive_action", "Can perform sensitive product action"),
]
`makemigrations` மற்றும் `migrate` ஐ இயக்கிய பிறகு, இந்த அனுமதி ஜாங்கோ நிர்வாகத்தில் பயனர்கள் மற்றும் குழுக்களுக்குத் தோன்றும்.
முறை 2: get_actions()
வழியாகச் செயல்களை மாறும் வகையில் கட்டுப்படுத்துதல்
தற்போதைய பயனரின் அனுமதிகளின் அடிப்படையில் நிபந்தனைக்குட்பட்டுச் செயல்களை அகற்ற உங்கள் ModelAdmin
இல் உள்ள get_actions()
முறையை மேலெழுதலாம்:
# myapp/admin.py
class ProductAdmin(admin.ModelAdmin):
# ... actions definition ...
def get_actions(self, request: HttpRequest):
actions = super().get_actions(request)
# Remove the 'make_discounted' action if the user doesn't have a specific permission
if not request.user.has_perm('myapp.change_product'): # Or a custom permission like 'can_discount_product'
if 'make_discounted' in actions:
del actions['make_discounted']
return actions
இந்த அணுகுமுறை அங்கீகரிக்கப்படாத பயனர்களுக்குச் செயலை முற்றிலும் கண்ணுக்கு தெரியாததாக்குகிறது, மேலும் சுத்தமான UI ஐ வழங்குகிறது.
2. வலிமையான பிழை கையாளுதல்
தோல்விகளை முன்கூட்டியே அறிந்து, அவற்றை நேர்த்தியாகக் கையாளவும். தரவுத்தள செயல்பாடுகள், வெளிப்புற API அழைப்புகள் மற்றும் கோப்பு செயல்பாடுகளைச் சுற்றி try-except
தொகுதிகளைப் பயன்படுத்தவும். self.message_user(request, ..., messages.ERROR)
ஐப் பயன்படுத்தி பயனருக்குத் தகவலறிந்த பிழை செய்திகளை வழங்கவும்.
3. பயனர் கருத்து மற்றும் செய்திகள்
செயலின் விளைவைப் பற்றி பயனருக்கு எப்போதும் தெரிவிக்கவும். ஜாங்கோவின் செய்திகள் கட்டமைப்பு இதற்கு ஏற்றது:
messages.SUCCESS
: வெற்றிகரமான செயல்பாடுகளுக்கு.messages.WARNING
: பகுதி வெற்றிகள் அல்லது சிறிய சிக்கல்களுக்கு.messages.ERROR
: முக்கியமான தோல்விகளுக்கு.messages.INFO
: பொதுவான தகவல் செய்திகளுக்கு (எ.கா., "பணி வெற்றிகரமாக வரிசைப்படுத்தப்பட்டது.").
4. செயல்திறன் பரிசீலனைகள்
- மொத்தச் செயல்பாடுகள்: முடிந்தவரை, மொத்தத் தரவுத்தள செயல்பாடுகளுக்கு
queryset.update()
அல்லதுqueryset.delete()
ஐப் பயன்படுத்தவும். இவை ஒரு ஒற்றை SQL வினவலைச் செயல்படுத்துகின்றன, மேலும் ஒவ்வொரு பொருளையும் தனித்தனியாகக் கடந்து சேமிப்பது/நீக்குவதை விட கணிசமாக அதிக திறன் கொண்டவை. - அணு பரிவர்த்தனைகள்: ஒரு அலகாக வெற்றிபெற அல்லது தோல்வியடைய வேண்டிய பல தரவுத்தள மாற்றங்களை உள்ளடக்கிய செயல்களுக்கு, உங்கள் தர்க்கத்தை
from django.db import transaction
மற்றும்with transaction.atomic():
ஐப் பயன்படுத்தி ஒரு பரிவர்த்தனையில் சுற்றவும். - ஒத்திசைவற்ற பணிகள்: நீண்ட நேரம் எடுக்கும் செயல்பாடுகளுக்கு (API அழைப்புகள், அதிக கணக்கீடுகள், கோப்பு செயலாக்கம்), வலை சேவையகத்தைத் தடுப்பதைத் தடுக்க அவற்றை ஒரு பின்னணி பணி வரிசைக்கு (எ.கா., Celery) அனுப்பவும்.
5. மறுபயன்பாடு மற்றும் அமைப்பு
பல ModelAdmin
வகுப்புகள் அல்லது வெவ்வேறு திட்டங்களில் பயனுள்ளதாக இருக்கும் செயல்கள் உங்களிடம் இருந்தால், அவற்றைச் சுருக்கிவைக்கக் கருத்தில் கொள்ளுங்கள்:
- தனித்த செயல்பாடுகள்: செயல்களை
myapp/admin_actions.py
கோப்பில் தனித்த செயல்பாடுகளாக வரையறுத்து, அவற்றை உங்கள்ModelAdmin
வகுப்புகளில் இறக்குமதி செய்யவும். - மிக்ஸின்கள்: தொடர்புடைய படிவங்கள் அல்லது டெம்ப்ளேட்களுடன் கூடிய சிக்கலான செயல்களுக்கு, ஒரு
ModelAdmin
மிக்ஸின் வகுப்பை உருவாக்கவும்.
# myapp/admin_actions.py
from django.contrib import messages
from django.http import HttpRequest, HttpResponseRedirect
from django.db.models import QuerySet
def mark_as_active(modeladmin, request: HttpRequest, queryset: QuerySet):
updated = queryset.update(is_active=True)
modeladmin.message_user(request, f"{updated} item(s) marked as active.", messages.SUCCESS)
mark_as_active.short_description = "Mark selected as active"
# myapp/admin.py
from django.contrib import admin
from .models import MyModel
from .admin_actions import mark_as_active
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
list_display = ('name', 'is_active')
actions = [mark_as_active]
6. உங்கள் நிர்வாகச் செயல்களைச் சோதித்தல்
நிர்வாகச் செயல்கள் வணிகத் தர்க்கத்தின் முக்கியமான பகுதிகள் மற்றும் முழுமையாகச் சோதிக்கப்பட வேண்டும். காட்சிகளைச் சோதிக்க ஜாங்கோவின் Client
ஐயும், குறிப்பிட்ட நிர்வாகச் செயல்பாட்டிற்கு admin.ModelAdmin
சோதனை கிளையண்டையும் பயன்படுத்தவும்.
# myapp/tests.py
from django.test import TestCase, Client
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.contrib import admin
from .models import Product
from .admin import ProductAdmin # Import your ModelAdmin
User = get_user_model()
class ProductAdminActionTests(TestCase):
def setUp(self):
self.admin_user = User.objects.create_superuser('admin', 'admin@example.com', 'password')
self.client = Client()
self.client.login(username='admin', password='password')
self.p1 = Product.objects.create(name="Product A", price=10.00, is_discounted=False)
self.p2 = Product.objects.create(name="Product B", price=20.00, is_discounted=False)
self.p3 = Product.objects.create(name="Product C", price=30.00, is_discounted=True)
self.admin_site = admin.AdminSite()
self.model_admin = ProductAdmin(Product, self.admin_site)
def test_make_discounted_action(self):
# Simulate selecting products and performing the action
change_list_url = reverse('admin:myapp_product_changelist')
response = self.client.post(change_list_url, {
admin.ACTION_CHECKBOX_NAME: [self.p1.pk, self.p2.pk],
'action': 'make_discounted',
'index': 0, # Required for some Django admin internal logic
}, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, '2 product(s) were successfully marked as discounted.')
self.p1.refresh_from_db()
self.p2.refresh_from_db()
self.p3.refresh_from_db()
self.assertTrue(self.p1.is_discounted)
self.assertTrue(self.p2.is_discounted)
self.assertTrue(self.p3.is_discounted) # This one was already discounted
def test_make_discounted_action_confirmation(self):
# For actions with confirmation, you'd test the two-step process
change_list_url = reverse('admin:myapp_post_changelist') # Assuming Post model for confirmation example
post1 = Post.objects.create(title='Test Post 1', content='...', status='draft')
post2 = Post.objects.create(title='Test Post 2', content='...', status='draft')
# Step 1: Request confirmation page
response = self.client.post(change_list_url, {
admin.ACTION_CHECKBOX_NAME: [post1.pk, post2.pk],
'action': 'mark_posts_approved',
'index': 0,
})
self.assertEqual(response.status_code, 200)
self.assertIn(b"Confirm Action", response.content) # Check if confirmation page is rendered
# Step 2: Submit confirmation form
response = self.client.post(change_list_url, {
admin.ACTION_CHECKBOX_NAME: [post1.pk, post2.pk],
'action': 'mark_posts_approved',
'apply': 'Yes, I\'m sure',
'confirm': 'on', # Value for a checkbox if rendered as checkbox
'_selected_action': [str(post1.pk), str(post2.pk)], # Must be passed back from form
'index': 0,
}, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, '2 post(s) were successfully marked as approved.')
post1.refresh_from_db()
post2.refresh_from_db()
self.assertEqual(post1.status, 'approved')
self.assertEqual(post2.status, 'approved')
7. பாதுகாப்புக்கான சிறந்த நடைமுறைகள்
- உள்ளீட்டு சரிபார்ப்பு: எப்போதும் எந்த பயனர் உள்ளீட்டையும் (உதாரணமாக, உறுதிப்படுத்தல் படிவங்களிலிருந்து) ஜாங்கோ படிவங்களைப் பயன்படுத்தி சரிபார்க்கவும். அசல் பயனர் உள்ளீட்டை ஒருபோதும் நம்ப வேண்டாம்.
- CSRF பாதுகாப்பு: அனைத்து படிவங்களும் (உங்கள் செயல் டெம்ப்ளேட்டுகளில் உள்ள தனிப்பயன் படிவங்கள் உட்பட)
{% csrf_token %}
ஐ உள்ளடக்கியுள்ளதா என்பதை உறுதிப்படுத்தவும். - SQL இன்ஜெக்ஷன்: ஜாங்கோவின் ORM இயல்பாக SQL இன்ஜெக்ஷனில் இருந்து பாதுகாக்கிறது. இருப்பினும், உங்கள் செயல்களுக்குள் சிக்கலான வினவல்களுக்கு நீங்கள் எப்போதாவது அசல் SQL ஐப் பயன்படுத்தினால் எச்சரிக்கையாக இருங்கள்.
- உணர்திறன் தரவு: உணர்திறன் தரவை (API சாவிகள், தனிப்பட்ட தகவல்) பாதுகாப்பாகக் கையாளவும். தேவையில்லாமல் அதைப் பதிவு செய்வதைத் தவிர்க்கவும், சரியான அணுகல் கட்டுப்பாடுகளை உறுதிப்படுத்தவும்.
பொதுவான சிக்கல்கள் மற்றும் தீர்வுகள்
அனுபவம் வாய்ந்த டெவலப்பர்கள் கூட நிர்வாகச் செயல்களில் சிக்கல்களை எதிர்கொள்ளலாம். சில பொதுவான சிக்கல்கள் இங்கே:
-
return HttpResponseRedirect
ஐ மறந்துவிடுதல்:சிக்கல்: புதிய பக்கத்தை வழங்காத (ஏற்றுமதி செய்வது போன்ற) ஒரு வெற்றிகரமான செயலுக்குப் பிறகு,
HttpResponseRedirect
ஐத் திருப்பி அனுப்ப மறந்துவிடுதல். பக்கம் புதுப்பிக்கப்படலாம், ஆனால் வெற்றிச் செய்தி தோன்றாது, அல்லது உலாவி புதுப்பிப்பில் செயல்பாடு இரண்டு முறை செயல்படலாம்.தீர்வு: கோப்பை (CSV போன்ற) வழங்காத அல்லது வேறு பக்கத்தை வழங்காத வரை, உங்கள் செயல் தர்க்கம் முடிந்த பிறகு உங்கள் செயல்பாடு செயல்பாட்டை எப்போதும்
return HttpResponseRedirect(request.get_full_path())
(அல்லது ஒரு குறிப்பிட்ட URL) உடன் முடிக்கவும். -
உறுதிப்படுத்தல் படிவங்களுக்கு
POST
மற்றும்GET
ஐக் கையாளாமல் இருப்பது:சிக்கல்: செயலுக்கான ஆரம்ப கோரிக்கை மற்றும் அடுத்தடுத்த படிவச் சமர்ப்பிப்பு இரண்டையும் ஒரே மாதிரியாகக் கருதுவது, உறுதிப்படுத்தல் இல்லாமல் செயல்கள் செயல்பட அல்லது படிவங்கள் சரியாகக் காண்பிக்கப்படாமல் இருப்பதற்கு வழிவகுக்கிறது.
தீர்வு: ஆரம்ப கோரிக்கை (படிவத்தைக் காண்பி) மற்றும் உறுதிப்படுத்தல் சமர்ப்பிப்பு (தரவைச் செயலாக்கு) ஆகியவற்றுக்கு இடையே வேறுபடுத்த நிபந்தனை தர்க்கத்தைப் பயன்படுத்தவும் (எ.கா.,
if 'apply' in request.POST:
அல்லதுrequest.method == 'POST'
). -
பெரிய வினவல் தொகுதிகளுடன் செயல்திறன் சிக்கல்கள்:
சிக்கல்: ஆயிரக்கணக்கான பொருள்களைக் கடந்து ஒவ்வொன்றிலும்
.save()
ஐ அழைப்பது, அல்லது தேர்ந்தெடுக்கப்பட்ட ஒவ்வொரு உருப்படிக்கும் சிக்கலான கணக்கீடுகளை ஒத்திசைவாகச் செயல்படுத்துவது.தீர்வு: மொத்த புலம் மாற்றங்களுக்கு
queryset.update()
ஐப் பயன்படுத்தவும். சிக்கலான, நீண்ட நேரம் எடுக்கும் அல்லது I/O-சார்ந்த பணிகளுக்கு, Celery உடன் ஒத்திசைவற்ற செயலாக்கத்தைப் பயன்படுத்தவும். ஒரு செயல்பாடு உண்மையில் சிறிய துணைத்தொகுப்புகளுக்கு மட்டுமே என்றால், பக்கப்படுத்துதல் அல்லது வரம்புகளைக் கருத்தில் கொள்ளவும். -
தேர்ந்தெடுக்கப்பட்ட பொருள் ஐடிகளை தவறாக அனுப்புதல்:
சிக்கல்: உறுதிப்படுத்தல் பக்கங்களைச் செயல்படுத்தும் போது, ஆரம்ப POST இலிருந்து தேர்ந்தெடுக்கப்பட்ட பொருள்களின் முதன்மை சாவிகளைக் கொண்ட
_selected_action
மறைக்கப்பட்ட உள்ளீட்டை உறுதிப்படுத்தல் படிவத்திற்கு அனுப்பவும், பின்னர் இறுதி POST க்கு மீண்டும் அனுப்பவும் மறந்துவிடுதல்.தீர்வு: உங்கள் உறுதிப்படுத்தல் படிவம் மற்றும் டெம்ப்ளேட்
request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
ஐச் சரியாகக் கையாள்கின்றன மற்றும் இந்த ஐடிகளை உறுதிப்படுத்தல் படிவத்தில் மறைக்கப்பட்ட உள்ளீடுகளாக மீண்டும் உட்பொதிக்கின்றன என்பதை உறுதிப்படுத்தவும். -
அனுமதி மோதல்கள் அல்லது காணாமல் போன அனுமதிகள்:
சிக்கல்: ஒரு நிர்வாகிக்கு ஒரு செயல்பாடு தோன்றவில்லை, அல்லது அவர்களுக்கு அணுகல் இருக்க வேண்டும் என்று தோன்றினாலும், அனுமதி மறுக்கப்பட்ட பிழை ஏற்படுகிறது.
தீர்வு: உங்கள்
get_actions()
மேலெழுதலை மற்றும் செயலுக்குள் உள்ளrequest.user.has_perm()
சரிபார்ப்புகளை இருமுறை சரிபார்க்கவும்.Meta
இல் தனிப்பயன் அனுமதிகள் வரையறுக்கப்பட்டுள்ளன என்பதையும், இடமாற்றங்கள் இயக்கப்பட்டுள்ளன என்பதையும் உறுதிப்படுத்தவும். நிர்வாகத்தில் பயனர்/குழு பணிகளை சரிபார்க்கவும்.
முடிவுரை: உங்கள் ஜாங்கோ நிர்வாகத்திற்கு அதிகாரம் அளித்தல்
ஜாங்கோ நிர்வாக இடைமுகம் ஒரு எளிய தரவு மேலாண்மை கருவியை விட அதிகம்; இது அதிநவீன நிர்வாக பணிப்பாய்வுகளை உருவாக்க ஒரு சக்திவாய்ந்த கட்டமைப்பாகும். தனிப்பயன் நிர்வாகச் செயல்களைப் பயன்படுத்துவதன் மூலம், எளிய மொத்த புதுப்பிப்புகள் முதல் வெளிப்புற அமைப்புகளுடன் சிக்கலான ஒருங்கிணைப்புகள் மற்றும் தனிப்பயன் அறிக்கைகளை உருவாக்குதல் வரை கிட்டத்தட்ட எந்த வணிகத் தேவையையும் பூர்த்தி செய்ய அதன் திறன்களை விரிவாக்கலாம்.
இந்த வழிகாட்டி வலுவான, பாதுகாப்பான மற்றும் பயனர் நட்பு நிர்வாகச் செயல்களை உருவாக்குவதற்கான அடிப்படைக் கருத்துக்கள், நடைமுறைச் செயலாக்கங்கள் மற்றும் மேம்பட்ட நுட்பங்கள் மூலம் உங்களை அழைத்துச் சென்றது. பயனர் கருத்துகளுக்கு முன்னுரிமை அளிக்க, வலுவான பிழை கையாளுதலைச் செயல்படுத்த, பெரிய தரவுத்தொகுப்புகளுக்கான செயல்திறனைக் கருத்தில் கொள்ள மற்றும் எப்போதும் சரியான அங்கீகாரத்தைப் பராமரிக்க நினைவில் கொள்ளுங்கள். இந்த கொள்கைகளை மனதில் கொண்டு, உங்கள் ஜாங்கோ நிர்வாகத்தின் முழு திறனையும் வெளிக்கொணர நீங்கள் இப்போது தயாராக உள்ளீர்கள், இது உங்கள் பயன்பாடுகளையும் தரவையும் உலகளவில் நிர்வகிப்பதற்கு இன்னும் அவசியமான சொத்தாக மாற்றும்.
இன்றே தனிப்பயன் செயல்களுடன் பரிசோதனை செய்யத் தொடங்குங்கள், உங்கள் நிர்வாகத் திறன் உயர்ந்து செல்வதைப் பாருங்கள்!